import re
from datetime import datetime, date, timedelta
import time
import locale

# 获取某些特定的时间
class Getdate():
    def __init__(self):
        self.now = datetime.now()
        self.week_list = ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"]

    def getYesterday(self):
        '''获取昨天的日期，默认格式为：年月日'''
        return (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d")

    def getYesterdayALL(self):
        '''获取昨天的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-1)).strftime("%Y-%m-%d %H:%M:%S")

    def getDayBeforeYesterday(self):
        '''获取前天的日期'''
        return (date.today() + timedelta(days=-2)).strftime("%Y-%m-%d")

    def getDayBeforeYesterdayALL(self):
        '''获取前天的日期,默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-2)).strftime("%Y-%m-%d %H:%M:%S")

    def getThreeDaysAgo(self):
        '''获取3天前的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-3)).strftime("%Y-%m-%d")
    def getThreeDaysAgoALL(self):
        '''获取3天前的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-3)).strftime("%Y-%m-%d %H:%M:%S")

    def getFourDaysAgo(self):
        '''获取4天前的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-4)).strftime("%Y-%m-%d")
    def getFourDaysAgoALL(self):
        '''获取4天前的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-4)).strftime("%Y-%m-%d %H:%M:%S")

    def getFiveDaysAgo(self):
        '''获取5天前的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-5)).strftime("%Y-%m-%d")
    def getFiveDaysAgoALL(self):
        '''获取5天前的日期，默认格式为：年月日 时分秒'''
        return (date.today() + timedelta(days=-5)).strftime("%Y-%m-%d %H:%M:%S")

    def getSixDaysAgo(self):
        '''获取6天前的日期，默认格式为：年月日'''
        return (date.today() + timedelta(days=-6)).strftime("%Y-%m-%d")

    def getSixDaysAgoALL(self):
        '''获取6天前的日期，默认格式为：年月日'''
        return (date.today() + timedelta(days=-6)).strftime("%Y-%m-%d %H:%M:%S")

    def getSevenDaysAgo(self):
        '''获取7天前的日期，默认格式为：年月日'''
        return (date.today() + timedelta(days=-7)).strftime("%Y-%m-%d")

    def getSevenDaysAgoALL(self):
        '''获取7天前的日期，默认格式为：年月日'''
        return (date.today() + timedelta(days=-7)).strftime("%Y-%m-%d %H:%M:%S")

    def getTomorrow(self):
        '''获取明天的日期'''
        return (date.today() + timedelta(days=1)).strftime("%Y-%m-%d")

    def getCurrentdayAll(self):
        '''获取当前的详细日期，格式为：年月日 时分秒'''
        return self.now.strftime("%Y-%m-%d %H:%M:%S")

    def getCurrentday(self):
        '''获取当前的日期，默认格式为：年月日'''
        return self.now.strftime("%Y-%m-%d")

    def getCurrentmonth(self):
        '''获取当前月份'''
        return self.now.strftime("%m")

    def getCurrentYearAndMonth(self):
        '''获取当前 年份和月份'''
        return self.now.strftime("%Y-%m")

    def getCurrendayOnly(self):
        '''获取当前日'''
        return self.now.strftime("%d")

    def getThisWeekStart(self):
        '''获取本周开始日期'''
        return self.now - timedelta(days=self.now.weekday())

    def getThisWeekEnd(self):
        '''获取本周结束日期'''
        return self.now + timedelta(days=6 - self.now.weekday())

    def getLastWeekStart(self):
        '''获取上周开始日期'''
        return (self.now - timedelta(days=self.now.weekday() + 7)).strftime("%m-%d")

    def getLastWeekEnd(self):
        '''获取上周结束日期'''
        return (self.now - timedelta(days=self.now.weekday() + 1)).strftime("%m-%d")

    def getThisMonthStart(self):
        '''获取本月开始日期'''
        return datetime(self.now.year, self.now.month, 1)

    def getThisMonthEnd(self):
        '''获取本月结束日期'''
        return datetime(self.now.year, self.now.month + 1, 1) - timedelta(days=1)

    def getThisMonthEnd_1(self):
        '''获取本月结束日期,设置时间为最后1天的23：59：59'''
        next_month = self.now.replace(day=28) + timedelta(days=4)
        last_day_of_month = next_month - timedelta(days=next_month.day)
        end_of_month = last_day_of_month.replace(hour=23, minute=59, second=59, microsecond=999999)
        return end_of_month.strftime("%Y-%m-%d %H:%M:%S")

    def getLastMonthStart(self):
        '''获取上月开始日期'''
        return datetime(self.getLastMonthEnd().year, self.getLastMonthEnd().month, 1)

    def getLastMonthEnd(self):
        '''获取上月结束日期'''
        return self.getThisMonthStart() - timedelta(days=1)

    def getThisQuarterStart(self):
        '''获取本季度开始日期'''
        month = (self.now.month - 1) - (self.now.month - 1) % 3 + 1
        return datetime(self.now.year, month, 1)

    def getThisQuarterEnd(self):
        '''获取本季度结束日期'''
        month = (self.now.month - 1) - (self.now.month - 1) % 3 + 1
        if month == 10:
            return self.getThisYearEnd()
        else:
            return datetime(self.now.year, month + 3, 1) - timedelta(days=1)

    def getLastQuarterStart(self):
        '''获取上季度开始日期'''
        return datetime(self.getLastQuarterEnd().year, self.getLastQuarterEnd().month - 2, 1)

    def getLastQuarterEnd(self):
        '''获取上季度结束日期'''
        return self.getThisQuarterStart() - timedelta(days=1)

    def getThisYearStart(self):
        '''获取今年开始日期'''
        return datetime(self.now.year, 1, 1)

    def getThisYearEnd(self):
        '''获取今年结束日期'''
        return datetime(self.now.year + 1, 1, 1) - timedelta(days=1)

    def getLastYearStart(self):
        '''获取去年开始日期'''
        return datetime(self.getLastYearEnd().year, 1, 1)

    def getLastYearEnd(self):
        '''获取去年结束日期'''
        return self.getThisYearStart() - timedelta(days=1)

    def getWeekday(self, days_offset=0):
        '''获取某一天是星期几，默认是今天，可传入 days_offset 来获取其他日期'''
        day_index = (self.now.weekday() + days_offset) % 7
        return self.week_list[day_index]

    def getWeekdayToday(self):
        '''获取今天是星期几'''
        return self.getWeekday()

    def getWeekdayYesterday(self):
        '''获取昨天是星期几'''
        return self.getWeekday(-1)


# 将日期字符串转换为时间戳（支持秒和毫秒）
def date_to_timestamp(date_str, date_format="%Y-%m-%d %H:%M:%S", unit='s'):
    # 将日期字符串转换为datetime对象
    dt_obj = datetime.strptime(date_str, date_format)
    # 根据单位转换为时间戳
    timestamp = int(dt_obj.timestamp())  # 默认返回秒级时间戳
    if unit == 'ms':
        timestamp *= 1000  # 转换为毫秒
    return timestamp


# 将时间戳转换为日期字符串（支持秒和毫秒，且支持指定地区）
def timestamp_to_date(timestamp, date_format="%Y-%m-%d %H:%M:%S", unit='s', locale_str=None):
    # 如果提供了地区，则设置地区
    if locale_str:
        try:
            locale.setlocale(locale.LC_TIME, locale_str)
        except locale.Error:
            print(f"无法设置地区为 {locale_str}，请确保该地区在系统中有效。")

    # 根据单位调整时间戳（支持秒和毫秒）
    if unit == 'ms':
        timestamp /= 1000  # 将毫秒转换为秒

    # 将时间戳转换为datetime对象
    dt_obj = datetime.fromtimestamp(timestamp)
    # 格式化为日期字符串
    date_str = dt_obj.strftime(date_format)
    return date_str

def parse_duration(time_str='1m'):
    """将时间字符串转换为秒数"""
    units = {
        "s": 1,
        "m": 60,
        "h": 3600
    }
    match = re.match(r"(\d+)([smh])", time_str)
    if match:
        return int(match.group(1)) * units[match.group(2)]
    return 60  # 默认1分钟




if __name__ == '__main__':
    print(Getdate().getSevenDaysAgo())

    #############
    # 示例：日期转换为时间戳
    # date_str = "2025-02-13 00:00:00"
    # timestamp = date_to_timestamp(date_str, unit='ms')
    # print(f"日期 '{date_str}' 转换为毫秒时间戳: {timestamp}")

    # # 示例：时间戳转换为日期
    # converted_date = timestamp_to_date(timestamp, unit='ms', locale_str='en_US.UTF-8')
    # print(f"时间戳 {timestamp} 转换为日期（美国格式）: {converted_date}")
    #
    # # 示例：使用不同地区（德国）格式转换
    # converted_date_de = timestamp_to_date(timestamp, unit='ms', locale_str='de_DE.UTF-8')
    # print(f"时间戳 {timestamp} 转换为日期（德国格式）: {converted_date_de}")
